package com.tbit.uqbike.webmanager.dao.core;


import com.tbit.uqbike.object.pojo.Account;
import com.tbit.uqbike.object.pojo.MachineShortInfo;
import com.tbit.uqbike.object.pojo.vo.AccountPathVO;
import com.tbit.uqbike.object.pojo.vo.AreaVO;
import com.tbit.uqbike.object.value.LoginInfo;
import org.apache.ibatis.annotations.Param;

import java.util.List;
import java.util.Map;

/**
 * 账户dao
 *
 * @author Leon
 * 2017年2月24日 下午4:02:36
 */
public interface AccountDao {
    /**
     * 添加
     *
     * @param account
     */
    void insert(Account account);

    /**
     * 根据类型和用户名查询
     *
     */
    Account getByName(String name);

    List<Account> getByPhone(Map<String, Object> params);

    /**
     * 根据用户id查询
     *
     * @param accountId
     * @return
     */
    Account getByAccountId(Integer accountId);

    /**
     * 更新密码
     *
     * @param params
     */
    void updatePsd(Map<String, Object> params);

    /**
     * 获取代理商列表
     *
     * @param params
     * @return
     */
    List<Account> getAccountByType(Map<String, Object> params);

    List<Account> getAccountTree(Map<String, Object> params);

    /**
     * 根据名称模糊查询品牌信息
     */
    List<Account> getNameLike(@Param(value = "name") String name);

    /**
     * 删除代理商
     */
    void del(Integer accountId);

    /**
     * 更新账户信息
     *
     * @param account
     */
    void update(Account account);

    /**
     * 获取对应运营区域
     *
     * @param params
     * @return
     */
    List<Account> getByParams(Map<String, Object> params);

    /**
     * 获取对应运营区域数量
     *
     * @param params
     * @return
     */
    Integer getTotalByParams(Map<String, Object> params);

    /**
     * 根据parent获取对应账户
     *
     * @return
     */
    List<Account> getByParentId(Map<String, Object> params);

    /**
     * 根据parent获取对应账户总数
     *
     * @param params
     * @return
     */
    Integer getTotalByParentId(Map<String, Object> params);

    /**
     * 根据id获取账号，并支持扩展type/pid/aid
     * 分别对应类型、父节点、指定id
     *
     * @param params
     * @return
     */
    List<Account> getAccountByIdExTypePidAid(Map<String, Object> params);

    /**
     * 根据id和fid获取账号，并支持扩展type
     * type表示类型
     * fid表示加盟商ID
     *
     * @param params
     * @return
     */
    List<Account> getAccountByIdsFidExType(Map<String, Object> params);

    /**
     * 获取代理商用户列表
     *
     * @param params
     * @return
     */
    List<Account> getAgentList(Map<String, Object> params);

    /**
     * 获取下属代理商
     *
     * @param parentIds
     * @return
     */
    List<Integer> getAccountByParentId(Integer parentIds);

    /**
     * 获取品牌下的所有代理商
     *
     * @param parentIds
     * @return
     */
    List<Account> getAsByParentId(Integer parentIds);

    /**
     * 获取品牌下的所有运营区域
     *
     * @return
     */
    List<Integer> getByBrandId(Map<String, Object> params);

    /**
     * 根据账号id获取设备列表
     *
     * @param params
     * @return
     */
    List<MachineShortInfo> getMachineShortInfoByAccountId(Map<String, Object> params);

    /**
     * 删除品牌下的所有代理商
     */
    void delByParentIds(Integer parentId);

    /**
     * 模糊查询
     *
     * @param params
     * @return
     */
    List<Account> getByNameS(Map<String, Object> params);

    List<String> getMnosByIds(Map<String, Object> params);

    /**
     * 通过区域id获取品牌id
     *
     * @param accountId
     * @return
     */
    Account getAgentId(Integer accountId);

    /**
     * 通过品牌id获取区域id
     *
     * @param accountId
     * @return
     */
    List<Account> getById(Integer accountId);

    /**
     * 获取品牌id旗下所有层级结构
     *
     * @param accountId
     * @return
     */
    List<Account> getTree(@Param(value = "accountId") Integer accountId);

    /**
     * 获取所有类型数据
     *
     * @param type
     * @return
     */
    List<Account> getByType(@Param(value = "type") Integer type);

    /**
     * 批量获取树节点信息
     *
     * @param params
     * @return
     */
    List<Account> getTreeBatch(Map<String, Object> params);

    /**
     * 根据区域或者加盟商或客服的id获取品牌id
     */
    Integer getBrandIdByAccountId(@Param("accountId") Integer accountId, @Param("type") Integer type);

    AccountPathVO getAccountPathByRegionId(@Param("accountId") Integer accountId, @Param("type") Integer type);

    /**
     * 获取所有运营区域
     */
    List<Integer> getAllAreaId();

    LoginInfo getAdmin();

    /**
     * 获取角色的层次结构
     */
    List<Account> getAccountTreeById(@Param("type") Integer type, @Param("Id") Integer Id,
                                     @Param("name") String name);

    List<Account> getAllAccountId(@Param("id") Integer id);

    Account getByInfo(LoginInfo info);

    List<Integer> getRegionIdsByAccountID(@Param("accountIds") List<Integer> accountIds);

    Integer getRegionId(@Param("region") Integer regionId);

    /**
     * 获取品牌下的所有运营区域
     *
     * @param brandId
     * @return
     */
    List<AreaVO> getAreaByBrandId(@Param("brandId") Integer brandId);

    /**
     * 获取所有
     *
     * @param type
     * @return
     */
    List<Account> getAllAccount(@Param("type") Integer type);

    /**
     * 根据id查询
     *
     * @param accountIds
     * @return
     */
    List<Account> getByAccountIds(@Param("accountIds") List<Integer> accountIds);

    /**
     * 更新区域删除状态
     *
     * @param accountId
     * @param type
     * @param delFlag
     */
    void updateDelFlag(@Param("accountId") Integer accountId, @Param("type") Integer type, @Param("delFlag") Integer delFlag);

    List<Integer> getAllId(@Param("brandId") Integer brandId);

    /**
     * 根据账户id查询品牌id
     *
     * @param accountId 。
     * @return 。
     */
    Integer getBrandIdByAccountIdV2(@Param("accountId") Integer accountId);

    List<Account> listByParentId(@Param("parentId") Integer parentId);

    /**
     * 通过品牌id或加盟商id获取区域id
     *
     */
    List<Account> selectByIdAndType(@Param("accountId") Integer accountId, @Param("type") Integer type);

    /**
     * 获取加盟商和品牌id
     * @param accountId 区域id
     * @return
     */
    List<Integer> selectAccountAndParentId(@Param("accountId") Integer accountId);

    /**
     * 获取父级Id
     * @param accountId id
     * @return 父级id
     */
    Integer selectParentId(@Param("accountId") Integer accountId);

    /**
     * 根据品牌id获取区域id
     * @param brandIds 品牌od
     * @return 区域id
     */
    List<Integer> getAccountIdByBrandId(@Param("brandIds") List<String> brandIds);

    /**
     * 根据加盟商id获取区域id
     * @param franchiseeIds
     * @return 区域id
     */
    List<Integer> getAccountIdByFranchiseeId(@Param("franchiseeIds") List<String> franchiseeIds);

    /**
     * @description: 分段获取账户数据
     * @author: mo.shanyong
     * @date: 2025/1/6 15:22
     * @param: startId 起始id
     * @param: limit 页长
     * @return: java.util.List<com.tbit.uqbike.object.pojo.Account>
     */
    List<Account> getAccountByLimit(@Param("startId") Integer startId, @Param("limit") Integer limit);

    /**
     * @description: 根据账户id(可能是品牌id，加盟商id，区域id) 查找包含的所有区域id
     * @author: mo.shanyong
     * @date: 2025/2/19 14:20
     * @param: accountIdList
     * @return: java.util.List<java.lang.String>
     */
    List<Integer> getAllAccountIdByIds(@Param("accountIdList") List<Integer> accountIdList);

    /**
     * @description: 根据账户类型，查询全部的账户名称
     * @author: mo.shanyong
     * @date: 2025/2/19 14:29
     * @param: type
     * @return: java.util.List<java.lang.String>
     */
    List<String> getAllAccountName(@Param("type") Integer type);

    /**
     * 根据用户id获取用户绑定区域
     *
     * @param userId 用户id
     */
    List<Account> getAccountByUserBind(@Param("userId") Integer userId);
    /**
     * 根据类型获取所有节点
     *
     * @param type 1：品牌，2：加盟商 3：运营区域
     * @param delFlag 删除标识 0=未删除 1=已删除
     */
    List<Account> getAllAccountByType(@Param("type") Integer type, @Param("delFlag") Integer delFlag);

    /**
     * 根据id获取所有子节点
     *
     * @param accountId accountId
     * @param delFlag 删除标识 0=未删除 1=已删除
     */
    List<Account> getChildAccountById(@Param("accountId") Integer accountId, @Param("delFlag") Integer delFlag);

    /**
     * 根据区域id集合获取对应名称
     *
     * @param accountIdList 区域id集合
     * @return
     */
    List<Account> getAccountNameByIdList(@Param("accountIdList") List<Integer> accountIdList);
}